﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using EdexClient;

namespace IBS2IDEX
{
    public partial class Service1 : ServiceBase
    {
        private Timer timer = null;
        private EdexClient.API_SESSION session = new API_SESSION();

        public Service1()
        {
            InitializeComponent();
            try
            {
                if (!EventLog.SourceExists(this.ServiceName + "_log"))
                    EventLog.CreateEventSource(this.ServiceName, this.ServiceName + "_log");
            }
            catch { }
            serviceLog.Source = this.ServiceName + "_log";
            serviceLog.Log = this.ServiceName + "_log";
        }

        protected override void OnStart(string[] args)
        {
            serviceLog.WriteEntry(this.ServiceName + " запущен");
            Properties.Settings.Default.Reload();
            var ExecuteTimes = Properties.Settings.Default.ExecuteTimes;
            if (Properties.Settings.Default.ExecuteImmediately)
                ExecuteTimes.Add(DateTime.Now.AddMinutes(1).ToString("HH:mm"));
            timer = new Timer();
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = TimerUtil.GetNewTimerInterval(ExecuteTimes);
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
            serviceLog.WriteEntry(this.ServiceName + " остановлен");
            timer.Stop();
            timer.Close();
        }

        /// <summary>
        /// При срабатывании таймера
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            // Останавливаем таймей и стартуем выполнение выгрузки
            timer.Stop();
            Process();
            // Интервал таймера
            Properties.Settings.Default.Reload();
            timer.Interval = TimerUtil.GetNewTimerInterval(Properties.Settings.Default.ExecuteTimes);
            timer.Start();
        }

        private void Process()
        {
            try
            {
                serviceLog.WriteEntry("Запуск процедуры загрузки справочников BP");
                Properties.Settings.Default.Reload();
                string connectionString = Properties.Settings.Default.IBSConnectionString;
                string api = Properties.Settings.Default.ApiSite;
                string serviceMailAddress = Properties.Settings.Default.ServiceMailAddress;
                string userMailAddress = Properties.Settings.Default.UserMailAddress;                
                var ibs = new IBS.IbsDataContext(connectionString);
                var edex = new EdexClient.EdexContext(api);
                var login = Properties.Settings.Default.apiLogin;
                var pass = Properties.Settings.Default.apiPass;
                session = edex.GetSession(login, pass);
                edex.ChangeCompany("E4EFEE0D-0162-4FE8-B3A8-22DFFDDBA32B", session.APIKEY); //PETROL 
                

                try
                {
                    //Загрузка справочника компаний BP
                    var LastSyncDateBP = Properties.Settings.Default.LastSyncDateBP_Suppliers;
                    var LastSyncDateBP_IBS = ibs.GetLastSyncDate("LastSyncDateBP_Suppliers");
                    LastSyncDateBP = LastSyncDateBP > LastSyncDateBP_IBS ? LastSyncDateBP : LastSyncDateBP_IBS;
                    serviceLog.WriteEntry("Загрузка справочника компаний BP");     
                    var sup = ibs.GetLastModifiedBPSupplier(LastSyncDateBP).ToList();
                    var now = DateTime.Now;
                    edex.SendSupplier(sup, session.APIKEY);
                    ibs.SetLastSyncDate(now.ToString("dd.MM.yyyy HH:mm:ss"), "LastSyncDateBP_Suppliers");
                }
                catch (Exception ex)
                {
                    string errMsg = "При выполнении загрузки справочника компаний BP произошла ошибка: " + ex.Message + "\n" + ex.StackTrace;
                    serviceLog.WriteEntry(errMsg, EventLogEntryType.Error);
                    ibs.SendMail(serviceMailAddress, userMailAddress, "Ошибка загрузки справочника компаний в EDEX", errMsg);
                }

                try
                {
                    //Загрузка справочника станций BP
                    var LastSyncDateBP = Properties.Settings.Default.LastSyncDateBP_Suppliers;
                    var LastSyncDateBP_IBS = ibs.GetLastSyncDate("LastSyncDateBP_Sites");
                    LastSyncDateBP = LastSyncDateBP > LastSyncDateBP_IBS ? LastSyncDateBP : LastSyncDateBP_IBS;
                    serviceLog.WriteEntry("Загрузка справочника станций BP");                   
                    var sites = ibs.GetLastModifiedBPSite(LastSyncDateBP).ToList();
                    var now = DateTime.Now;
                    edex.SendLocations(sites, session.APIKEY);
                    ibs.SetLastSyncDate(now.ToString("dd.MM.yyyy HH:mm:ss"), "LastSyncDateBP_Sites");
                }
                catch (Exception ex)
                {
                    string errMsg = "При выполнении загрузки справочника станций BP произошла ошибка: " + ex.Message + "\n" + ex.StackTrace;
                    serviceLog.WriteEntry(errMsg, EventLogEntryType.Error);
                    ibs.SendMail(serviceMailAddress, userMailAddress, "Ошибка загрузки справочника станций в EDEX", errMsg);
                }

                try
                {
                    //Загрузка справочника товара BP
                    var LastSyncDateBP = Properties.Settings.Default.LastSyncDateBP_Items;
                    var LastSyncDateBP_IBS = ibs.GetLastSyncDate("LastSyncDateBP_Items");
                    LastSyncDateBP = LastSyncDateBP > LastSyncDateBP_IBS ? LastSyncDateBP : LastSyncDateBP_IBS;
                    serviceLog.WriteEntry("Загрузка справочника товара BP");  
                    var items = ibs.GetLastModifiedBPItems(LastSyncDateBP).ToList();
                    var now = DateTime.Now;
                    edex.SendItems(items, session.APIKEY);
                    ibs.SetLastSyncDate(now.ToString("dd.MM.yyyy HH:mm:ss"), "LastSyncDateBP_Items");
                }
                catch (Exception ex)
                {
                    string errMsg = "При выполнении загрузки справочника товара BP произошла ошибка: " + ex.Message + "\n" + ex.StackTrace;
                    serviceLog.WriteEntry(errMsg, EventLogEntryType.Error);
                    ibs.SendMail(serviceMailAddress, userMailAddress, "Ошибка загрузки справочника товара в EDEX", errMsg);
                }
                serviceLog.WriteEntry("Загрузка завершена");
            }
            catch (Exception ex)
            {
                string errMsg = "При выполнении процедуры произошла ошибка " + ex.Message + "\n" + ex.StackTrace;
                serviceLog.WriteEntry(errMsg, EventLogEntryType.Error);
            }
        }
    }
}